如何在Python中拟合一个阶梯函数

您所在的位置:网站首页 python model函数 如何在Python中拟合一个阶梯函数

如何在Python中拟合一个阶梯函数

2023-06-04 07:51| 来源: 网络整理| 查看: 265

我的做法是这样的。 我保留了xobs和yobs。

import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt xobs=np.linspace(0,10,100) yl=np.random.rand(50); yr=np.random.rand(50)+100 yobs=np.concatenate((yl,yr),axis=0)

现在,必须生成Heaviside函数。为了让你了解这个函数的概况,请考虑海维斯德函数的半最大值惯例。

Heaviside

在Python中,这相当于。【替换代码3

一个样本情节将是。

xval = sorted(np.concatenate([np.linspace(-5,5,100),[0]])) # includes x = 0 yval = f(xval) plt.plot(xval,yval,'ko-') plt.ylim(-0.1,1.1) plt.xlabel('x',size=18) plt.ylabel('H(x)',size=20)

Heaviside2

Now, plotting xobs and yobs gives:

plt.plot(xobs,yobs,'ko-') plt.ylim(-10,110) plt.xlabel('xobs',size=18) plt.ylabel('yobs',size=20)

xobs_yobs

请注意,比较这两幅图,第二幅图移位了5个单位,最大值从1.0增加到100。我推断,第二个图的函数可以表示为:。

Hfit

or in Python: (0.5 * (np.sign(x-5) + 1) * 100 = 50 * (np.sign(x-5) + 1)

结合这些图可以得出(其中Fit代表上述拟合函数)。

Heaviside_combined

该图证实了我的猜测是正确的。现在,假设你不知道这个正确的拟合函数是怎么来的,那么一个通用的拟合函数就产生了。def f(x,a,b,c): return a * (np.sign(x-b) + c),其中理论上,a = 50,b = 5,和c = 1。

继续进行估计。

popt,pcov=curve_fit(f,xobs,yobs,bounds=([49,4.75,0],[50,5,2])).

Now, bounds = ([lower bound of each parameter (a,b,c)],[upper bound of each parameter]). Technically, this means that 49 < a < 50, 4.75 < b < 5, and 0 < c < 2.

以下是popt和pcov的MY结果。 Results

pcov代表popt的估计协方差。对角线提供了参数估计的方差[Source].

结果显示,参数估计值pcov接近理论值。

基本上,一个广义的海维塞德函数可以用以下方式表示。【替换代码23

下面是将生成参数估计值和相应协方差的代码。

import numpy as np from scipy.optimize import curve_fit xobs = np.linspace(0,10,100) yl = np.random.rand(50); yr=np.random.rand(50)+100 yobs = np.concatenate((yl,yr),axis=0) def f(x,a,b,c): return a * (np.sign(x-b) + c) # Heaviside fitting function popt, pcov = curve_fit(f,xobs,yobs,bounds=([49,4.75,0],[50,5,2])) print 'popt = %s' % popt print 'pcov = \n %s' % pcov

最后,注意到popt和pcov的估计值不同。

pythonscipy



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3